'''
Created on 03/09/2013

@author: daniel
'''
import unittest
import colecciones.arbolGeneral
import directorio
import copy
#import colecciones.nodoGeneral

class SistemaDeDirectorios(colecciones.arbolGeneral.ArbolGeneral):
    
    def archivos(self,nombreDelDirectorio):
        if(self.getDatoRaiz().getNombre()==nombreDelDirectorio):return self.getDatoRaiz().getArchivos()
        i=0
        if(self.getHijos()==None):return None
        while (i<self.getHijos().getTamanio()):
            lista=self.getHijos().elemento(i).archivos(nombreDelDirectorio)
            if(lista!=None):
                return lista
            i+=1
        return None

    def subdirectorios(self,nombreDelDirectorio):
        if(self.getDatoRaiz().getNombre()==nombreDelDirectorio):return self.getHijos()
        i=0
        if(self.getHijos()==None):return None
        while (i<self.getHijos().getTamanio()):
            lista=self.getHijos().elemento(i).subdirectorios(nombreDelDirectorio)
            if(lista!=None):
                return lista
            i+=1
        return None
    
    def tamanio(self,nombreDelDirectorio):
        lista=self.archivos(nombreDelDirectorio)
        if(lista==None):return 0
        return self.__tamUnaLista(lista)
    
    def __tamUnaLista(self,unaListaDeArchivos):
        if(unaListaDeArchivos.esVacia()==True):return 0
        tamanio=0
        lista=copy.deepcopy(unaListaDeArchivos)
        while(lista.esVacia()==False):
            arch=lista.elemento(0)
            lista.eliminar(0)
            #print arch.__sizeof__()
            tamanio+=arch.__sizeof__()
        return tamanio

    def pathMasLargo(self):
        if(self.getHijos().esVacia()):return self.getDatoRaiz().getNombre()
        i=0
        maxPath=None
        while (i<self.getHijos().getTamanio()):
            hijoPath=self.getHijos().elemento(i).pathMasLargo()
            if(hijoPath>maxPath):maxPath=hijoPath
            i+=1
        return self.getDatoRaiz().getNombre()+maxPath

    
class Test(unittest.TestCase):


    def testInit(self):
        self.assertIsInstance(SistemaDeDirectorios(None),SistemaDeDirectorios, "testea creaciona de arbol")

    def testArchivos(self):
        obj=SistemaDeDirectorios(
            directorio.Directorio("nombre1")
                                 )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2")
                                 )
            )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2a")
                                 )
            )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2b")
                                 )
            )
        aux=obj.getRaiz()
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.1")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.2")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.3")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.4")
                                 )
            )

        #print obj.getHijos().elemento(0).getDatoRaiz().getNombre()
        obj.setRaiz(aux)
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getNombre()
        
        obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getArchivos().agregar("archivo",0)
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getNombre()
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getArchivos().elemento(0)
        self.assertFalse(obj.archivos("nombre1.2").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")
        self.assertTrue(obj.archivos("nombre1.3").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")
        self.assertFalse(obj.archivos("nombre1.4").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")

    def testSubdirectorios(self):
        obj=SistemaDeDirectorios(
            directorio.Directorio("nombre1")
                                 )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2")
                                 )
            )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2a")
                                 )
            )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2b")
                                 )
            )
        aux=obj.getRaiz()
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.1")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.2")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.3")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.4")
                                 )
            )

        #print obj.getHijos().elemento(0).getDatoRaiz().getNombre()
        obj.setRaiz(aux)
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getNombre()
        
        obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getArchivos().agregar("archivo",0)
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getNombre()
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getArchivos().elemento(0)
        #self.assertFalse(obj.subdirectorios("nombre1.2").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")
        self.assertEquals(obj.subdirectorios("nombre1.2"),obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getHijos(), "Verifica correcta devolucion de la funcion subdirectorios")
        #self.assertFalse(obj.subdirectorios("nombre1.4").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")

    def testTamanio(self):
        obj=SistemaDeDirectorios(
            directorio.Directorio("nombre1")
                                 )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2")
                                 )
            )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2a")
                                 )
            )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2b")
                                 )
            )
        aux=obj.getRaiz()
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.1")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.2")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.3")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.4")
                                 )
            )

        #print obj.getHijos().elemento(0).getDatoRaiz().getNombre()
        obj.setRaiz(aux)
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getNombre()
        
        obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getArchivos().agregar("archivo",0)
        #print obj.tamanio("nombre1.3")
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getNombre()
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getArchivos().elemento(0)
        #self.assertFalse(obj.archivos("nombre1.2").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")
        self.assertTrue(obj.archivos("nombre1.3").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")
        self.assertEquals(obj.tamanio("nombre1.3"),44, "Verifica el correcto muestreo de la funcion archivos")
        #self.assertFalse(obj.archivos("nombre1.4").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")

    def testPathMasLargo(self):
        obj=SistemaDeDirectorios(
            directorio.Directorio("nombre1")
                                 )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2")
                                 )
            )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2a")
                                 )
            )
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre2b")
                                 )
            )
        aux=obj.getRaiz()
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.1")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.2")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.3")
                                 )
            )
        obj.setRaiz(obj.getHijos().elemento(0).getRaiz())
        obj.agregarHijo(
            SistemaDeDirectorios(
                directorio.Directorio("nombre1.4")
                                 )
            )

        #print obj.getHijos().elemento(0).getDatoRaiz().getNombre()
        obj.setRaiz(aux)
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getNombre()
        
        obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getArchivos().agregar("archivo",0)
        #print obj.tamanio("nombre1.3")
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getNombre()
        #print obj.getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz().getArchivos().elemento(0)
        #self.assertFalse(obj.archivos("nombre1.2").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")
        self.assertTrue(obj.archivos("nombre1.3").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")
        #print obj.pathMasLargo()
        self.assertEquals(obj.pathMasLargo(),"nombre1nombre2nombre1.1nombre1.2nombre1.3nombre1.4", "Verifica el correcto muestreo de la funcion archivos")
        #self.assertFalse(obj.archivos("nombre1.4").incluye( "archivo"), "Verifica el correcto muestreo de la funcion archivos")

        
if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()